﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using ECOSYSTEM_Dominio;

namespace ECOSYSTEM_DAL
{
    public class BoletaDAL
    {
        SqlConnection cnn;
        Int32 res;
        public Int32 RegistrarBoleta(Boleta laBoleta)
        {
            try
            {
                cnn = (SqlConnection)ConexionSQL.getInstancia().getConexion();
                cnn.Open();

                SqlCommand cmd = new SqlCommand("RegistrarBoleta", cnn);
                cmd.CommandType = CommandType.StoredProcedure;

                cmd.Parameters.Add("@NroBoleta", SqlDbType.NVarChar, 10);
                cmd.Parameters.Add("@FecEmisionBol", SqlDbType.NVarChar, 12);
                cmd.Parameters.Add("@TCambioBol", SqlDbType.NVarChar);
                cmd.Parameters.Add("@Moneda", SqlDbType.NVarChar, 10);
                cmd.Parameters.Add("@Estado", SqlDbType.NVarChar,20);
                cmd.Parameters.Add("@TotalBol", SqlDbType.Money);
                cmd.Parameters.Add("@TCancelacionBoleta", SqlDbType.NVarChar,20);
                cmd.Parameters.Add("@PagoCon", SqlDbType.Float);
                cmd.Parameters.Add("@DiasPlasoPago", SqlDbType.Int);
                cmd.Parameters.Add("@RUC_DNI_Cliente", SqlDbType.NVarChar, 11);
                //cmd.Parameters.Add("@UsuarioID", SqlDbType.Int);

                cmd.Parameters["@NroBoleta"].Value = laBoleta.NroBoleta;
                cmd.Parameters["@FecEmisionBol"].Value = laBoleta.FecEmisionBol;
                cmd.Parameters["@TCambioBol"].Value = laBoleta.TCambioBol;
                cmd.Parameters["@Moneda"].Value = laBoleta.ModenaBol;
                cmd.Parameters["@Estado"].Value = laBoleta.Estado;
                cmd.Parameters["@TCancelacionBoleta"].Value = laBoleta.TCancelacionBol;
                cmd.Parameters["@PagoCon"].Value = laBoleta.PagoCon;
                cmd.Parameters["@DiasPlasoPago"].Value = laBoleta.DiasPlasoPago;
                cmd.Parameters["@TotalBol"].Value = laBoleta.TotalBol;
                cmd.Parameters["@RUC_DNI_Cliente"].Value = laBoleta.ElCliente;
               // cmd.Parameters["@UsuarioID"].Value = laBoleta.ElUsuario;

                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    res = Convert.ToInt32(dr["CodBoletaID"]);
                }
            }
            catch (SqlException ex) { throw new Exception(ex.Message); }
            catch (Exception e) { throw new Exception(e.Message); }
            finally
            {
                if (cnn.State == ConnectionState.Open)
                {
                    cnn.Close();
                }
            }
            return res;
        }

        public Boolean guardarDetalleBoletaProducto(Boleta.DetalleBoleta elDetalleBoletaProd)
        {
            try
            {
                cnn = (SqlConnection)ConexionSQL.getInstancia().getConexion();
                cnn.Open();

                SqlCommand cmd = new SqlCommand("RegistrarDetalleBoletaProducto", cnn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add("@BoletaID", SqlDbType.Int);
                cmd.Parameters.Add("@ProductoID", SqlDbType.Int);
                cmd.Parameters.Add("@PrecioVentProd", SqlDbType.Money);
                cmd.Parameters.Add("@CantidProd", SqlDbType.Int);
                cmd.Parameters["@BoletaID"].Value = elDetalleBoletaProd.BoletaID;
                cmd.Parameters["@ProductoID"].Value = elDetalleBoletaProd.ElProducto;
                cmd.Parameters["@PrecioVentProd"].Value = elDetalleBoletaProd.PrecioVentaProducto;
                cmd.Parameters["@CantidProd"].Value = elDetalleBoletaProd.CantidadProd;
                cmd.ExecuteNonQuery();
            }
            catch (SqlException ex) { throw new Exception(ex.Message); }
            catch (Exception e) { throw new Exception(e.Message); }
            finally
            {
                if (cnn.State == ConnectionState.Open)
                {
                    cnn.Close();
                }
            }
            return true;
        }
        public DataTable ObtenerListaBoletasEmitidas(String FecEmision)
        {
            DataTable lista = null;
            try
            {
                cnn = (SqlConnection)ConexionSQL.getInstancia().getConexion();
                cnn.Open();
                SqlDataAdapter da = new SqlDataAdapter("ObtenerListaBoletas", cnn);
                da.SelectCommand.CommandType = CommandType.StoredProcedure;
                da.SelectCommand.Parameters.AddWithValue("Fecha", FecEmision);
                lista = new DataTable();
                da.Fill(lista);
            }
            catch (SqlException ex) { throw new Exception(ex.Message); }
            catch (Exception e) { throw new Exception(e.Message); }
            finally
            {
                if (cnn.State == ConnectionState.Open)
                {
                    cnn.Close();
                }
            }
            return lista;
        }
        public List<Boleta.DetalleBoleta> ObtenerDetalleBoletaEmitida(Int32 BoletaID)
        {
            List<Boleta.DetalleBoleta> lista;
            try
            {
                cnn = (SqlConnection)ConexionSQL.getInstancia().getConexion();
                cnn.Open();
                SqlCommand cmd = new SqlCommand("ObtenerDetalleBoletaEmitida", cnn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("BoletaID", BoletaID);
                lista = new List<Boleta.DetalleBoleta>();
                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    Boleta.DetalleBoleta elDetalle = new Boleta.DetalleBoleta();
                    elDetalle.CantidadProd = Convert.ToInt32(dr["Cantidad"]);
                    elDetalle.NameProduc = dr["NameProduc"].ToString();
                    elDetalle.PrecioVentaProducto = Convert.ToDouble(dr["PrecioVenta"]);
                    elDetalle.ElProducto = Convert.ToInt32(dr["ProductoID"]);
                    lista.Add(elDetalle);
                }
                return lista;
            }
            catch (SqlException ex) { throw new Exception(ex.Message); }
            catch (Exception e) { throw new Exception(e.Message); }
            finally
            {
                if (cnn.State == ConnectionState.Open)
                {
                    cnn.Close();
                }
            }
        }
        public Boolean ActualizarBoleta(Boleta laBoleta,Int32 BoletaID, String NroBoleta) {
            try
            {
                cnn = (SqlConnection)ConexionSQL.getInstancia().getConexion();
                cnn.Open();
                SqlCommand cmd = new SqlCommand("ActualizarBoleta", cnn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("BoletaID",BoletaID);
                cmd.Parameters.AddWithValue("NroBoleta", laBoleta.NroBoleta);
                cmd.Parameters.AddWithValue("NroBoletaComparar", NroBoleta);
                cmd.Parameters.AddWithValue("FecEmisionBol",laBoleta.FecEmisionBol);
                cmd.Parameters.AddWithValue("Moneda",laBoleta.ModenaBol);
                cmd.Parameters.AddWithValue("TCancelacionBoleta",laBoleta.TCancelacionBol);
                cmd.Parameters.AddWithValue("TCambioBol",laBoleta.TCambioBol);                
                cmd.Parameters.AddWithValue("Estado",laBoleta.Estado);
                cmd.Parameters.AddWithValue("TotalBol",laBoleta.TotalBol);                
                cmd.Parameters.AddWithValue("PagoCon",laBoleta.PagoCon);
                cmd.Parameters.AddWithValue("DiasPlasoPago",laBoleta.DiasPlasoPago);
                cmd.Parameters.AddWithValue("RUCCLiente", laBoleta.ElCliente);
                cmd.ExecuteNonQuery();
            }
            catch (SqlException ex) { throw new Exception(ex.Message); }
            catch (Exception e) { throw new Exception(e.Message); }
            finally {
                if (cnn.State == ConnectionState.Open) {
                    cnn.Close();
                }
            }
            return true;
        }
        public Boolean ActualizarDetalleBoletaProducto(Boleta.DetalleBoleta elDetalleBoletaProducto)
        {
            try
            {
                cnn = (SqlConnection)ConexionSQL.getInstancia().getConexion();
                cnn.Open();
                SqlCommand cmd = new SqlCommand("ActualizarDetalleBoletaProducto", cnn);
                cmd.CommandType = CommandType.StoredProcedure;

                cmd.Parameters.AddWithValue("PrecioVenProd", elDetalleBoletaProducto.PrecioVentaProducto);
                cmd.Parameters.AddWithValue("Cantidad", elDetalleBoletaProducto.CantidadProd);
                cmd.Parameters.AddWithValue("IDProducto", elDetalleBoletaProducto.ElProducto);
                cmd.Parameters.AddWithValue("IDBoleta", elDetalleBoletaProducto.BoletaID);
                cmd.ExecuteNonQuery();
            }
            catch (SqlException ex) { throw new Exception(ex.Message); }
            catch (Exception e) { throw new Exception(e.Message); }
            finally
            {
                if (cnn.State == ConnectionState.Open)
                {
                    cnn.Close();
                }
            }
            return true;
        }
        public Boolean EliminarProductoRegistradoDeDetalleBoleta(Int32 IDBol, Int32 IDProd)
        {
            try
            {
                cnn = (SqlConnection)ConexionSQL.getInstancia().getConexion();
                cnn.Open();
                SqlCommand cmd = new SqlCommand("EliminarProductoRegistradoDeDetalleBoleta", cnn);
                cmd.Parameters.AddWithValue("IDBol", IDBol);
                cmd.Parameters.AddWithValue("IDProd", IDProd);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.ExecuteNonQuery();
            }
            catch (SqlException ex) { throw new Exception(ex.Message); }
            catch (Exception e) { throw new Exception(e.Message); }
            finally
            {
                if (cnn.State == ConnectionState.Open)
                {
                    cnn.Close();
                }
            }
            return true;
        }
    }
}